import json
import pandas as pd
import requests
import os
import time

# --- 配置区 ---

# API配置
API_URL = "http://113.98.195.218:1434/api/generate"
MODEL_NAME = "qwen2.5-coder:32b"

# ==============================================================================
# --- 新增：模式选择 ---
# ==============================================================================
# 将此项设置为 True，可直接翻译下面的 MANUAL_BRANDS_INPUT 字符串，无需CSV文件。
# 将此项设置为 False，将执行原有的CSV批量翻译任务。
USE_DIRECT_STRING_INPUT = False

# 当 USE_DIRECT_STRING_INPUT 设置为 True 时，将翻译此处的品牌。
# 请将您需要翻译的品牌填入下方的字符串，并用'|'隔开。
MANUAL_BRANDS_INPUT = "The East - The Taste Of Indochine|Ivegan Supershop Old Quater Hanoi|Vinamilk|Shopee"

# --- 新增：国家文件选择 ---
# 设置要翻译的国家名称，程序将自动寻找 "{COUNTRY_NAME}_restaurant_details.csv" 格式的文件
# 例如：设置为 "印度尼西亚" 将处理 "印度尼西亚_restaurant_details.csv" 文件
COUNTRY_NAME = "菲律宾"  # 可选值: "印度尼西亚", "菲律宾", "马来西亚" 等
# ==============================================================================


# --- 文件和列配置 (当 USE_DIRECT_STRING_INPUT = False 时生效) ---
input_csv = f'{COUNTRY_NAME}_restaurant_details.csv'
base_name, _ = os.path.splitext(input_csv)
output_csv = f"{base_name}_translated.csv"
brand_column = '品牌名称'
translated_column = '品牌名称_intl'  # 新的翻译列的名称

# 批处理参数
batch_size = 5
sleep_interval = 5 # 每批次休眠时间（秒）

# --- 提示词模板 (已修改输出分隔符) ---
prompt_template = """
你是一位顶级的品牌本地化专家和富有创造力的品牌命名大师，精通越南语、英语和中文，对中国文化和消费者的审美有深刻的洞察。你的任务是处理一个品牌名称列表，将列表中的每一个品牌都转化为一个完美的、符合中国人阅读习惯和审美、且极具商业吸引力的简体中文品牌名。

对于输入列表中的【每一个】品牌，你都必须遵循以下【进阶决策流程】：

1.  **【最高优先级】解析品牌结构与意境**：
    *   首先，分析品牌名是否包含“主品牌 + 描述/副标题/地名”的结构（例如 `The East - The Taste Of Indochine` 或 `Ivegan Supershop Old Quater Hanoi`）。
    *   **禁止**对描述或副标题进行生硬的字面翻译。你的任务是【提炼】描述部分的【核心意境】（如“Indochine” -> 异域风情），并将其【艺术性地融合】进主品牌的中文名中。
    *   对于地名，如果它是品牌身份的一部分（如指代特定分店），应以符合中文商业习惯的方式自然地体现出来，例如使用括号作为后缀 `（XX店）`。

2.  **核实官方名称**：
    *   在确定了需要翻译的核心品牌和其意境后，检索并优先使用其官方或市场公认的中文名称。

3.  **融合“信达雅”进行艺术再创**：
    *   如果不存在官方名称，你需要进行艺术性的再创造，务必达到以下标准：
    *   **信 (Faithfulness)**：忠实于品牌的核心定位和产品属性（例如，餐厅、商店）。
    *   **达 (Expressiveness)**：中文名必须流畅、自然，易于口头传播，不能有任何西式语法或翻译腔。
    *   **雅 (Elegance)**：这是【最重要的标准】。名称必须优美、有格调，能引发积极的联想，符合中国人的文化审美。选择寓意美好、韵律和谐的汉字。

4.  **最终输出格式要求**：
    *   处理完输入列表中的【所有】品牌后，将得到的中文名称按照与输入列表完全相同的顺序，以【竖线 |】分隔，形成一个单一的字符串。
    *   **绝对禁止**：不要添加任何编号、引号、解释、分析过程或任何与中文名称无关的字符。

---
**示例 1 (常规翻译)**
输入: `Vinamilk|Shopee`
期望输出: `维娜奶|虾皮`

---
**示例 2 (意境融合与地名处理)**
输入: `The East - The Taste Of Indochine|Ivegan Supershop Old Quater Hanoi`
期望输出: `东境越味|爱素家优选（河内老城店）`
---

输入品牌名称列表（用'|'分隔）：{brands}
"""


# --- API 调用函数（已修改响应解析方式） ---
def translate_batch(brands):
    non_empty_brands = [brand for brand in brands if pd.notna(brand) and str(brand).strip() != '']
    if not non_empty_brands:
        return ['' for _ in brands]

    brands_string = "|".join(non_empty_brands)
    prompt = prompt_template.format(brands=brands_string)

    payload = {
        "model": MODEL_NAME,
        "prompt": prompt,
        "stream": False,
        "options": {
            "temperature": 0.2,
            "top_p": 1.0
        }
    }
    headers = {'Content-Type': 'application/json'}

    try:
        response = requests.post(API_URL, headers=headers, json=payload, timeout=180)
        response.raise_for_status()
        response_json = response.json()
        output_text = response_json['response'].strip()
        # --- 【核心修改 2】: 使用'|'来分割API返回的响应字符串 ---
        translated_list = [name.strip() for name in output_text.split('|')]

        result = []
        translated_idx = 0
        for original_brand in brands:
            if pd.notna(original_brand) and str(original_brand).strip() != '':
                if translated_idx < len(translated_list):
                    result.append(translated_list[translated_idx])
                    translated_idx += 1
                else:
                    print(f"警告：API返回结果数量不足。源: '{original_brand}' 将被置空。")
                    result.append('')
            else:
                result.append('')
        return result
    except Exception as e:
        print(f"\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
        print(f"!!! 批次翻译失败: {e}")
        if 'response' in locals() and response is not None:
            print(f"--- 大模型返回的原始数据 ---")
            print(f"HTTP Status Code: {response.status_code}")
            try:
                pretty_response = json.dumps(response.json(), indent=2, ensure_ascii=False)
                print(f"Response Body (JSON):\n{pretty_response}")
            except json.JSONDecodeError:
                print(f"Response Body (Text):\n{response.text}")
            print(f"--- 数据结束 ---")
        else:
            print("--- 未能从API获取任何响应（可能是网络问题、超时或请求前置错误） ---")
        print(f"!!! 该批次所有翻译将置为空字符串，以保证数据对一对应。")
        print(f"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n")
        return ['' for _ in brands]


# --- 主程序执行逻辑 (根据模式选择) ---
def run_direct_string_mode():
    """
    执行直接输入模式：翻译在脚本中指定的、用'|'分隔的品牌字符串。
    """
    print("--- 正在执行【直接输入模式】 ---")
    if not MANUAL_BRANDS_INPUT.strip():
        print("错误： MANUAL_BRANDS_INPUT 为空，请输入需要翻译的品牌。")
        return

    brands_list = [brand.strip() for brand in MANUAL_BRANDS_INPUT.split('|')]
    print(f"待翻译的品牌列表：{brands_list}")

    print("\n正在调用API进行翻译...")
    translated_names = translate_batch(brands_list)

    if len(translated_names) == len(brands_list):
        print("\n--- 翻译结果 ---")
        for original, translated in zip(brands_list, translated_names):
            print(f"原文: {original:<50} -> 译文: {translated}")
        print("--------------------")
    else:
        print("\n错误：翻译返回结果数量与输入不匹配。")


def run_csv_batch_mode():
    """
    执行CSV批量处理模式：读取CSV文件，进行批量翻译并保存结果。
    """
    print("--- 正在执行【CSV批量处理模式】 ---")
    print(f"当前设置的国家: {COUNTRY_NAME}")
    print(f"目标文件: {input_csv}")
    
    if not os.path.exists(input_csv):
        print(f"错误：输入文件 '{input_csv}' 不存在。")
        
        # 查找可用的国家文件
        available_files = []
        for file in os.listdir('.'):
            if file.endswith('_restaurant_details.csv'):
                country = file.replace('_restaurant_details.csv', '')
                available_files.append(country)
        
        if available_files:
            print(f"可用的国家文件:")
            for country in sorted(available_files):
                print(f"  - {country}")
            print(f"请在代码中将 COUNTRY_NAME 设置为上述国家之一")
        else:
            print("未找到任何 *_restaurant_details.csv 格式的文件")
        return
        
    df = pd.read_csv(input_csv, header=0)
    total_rows = len(df)
    print(f"成功读取文件，共 {total_rows} 行数据")
    print(f"列名: {list(df.columns)}")
    
    # 验证所需的列是否存在
    if brand_column not in df.columns:
        print(f"错误：文件中未找到列 '{brand_column}'")
        print(f"可用列: {list(df.columns)}")
        return
    
    print(f"品牌列 '{brand_column}' 验证成功")
    print(f"前5个品牌名称:")
    for i, brand in enumerate(df[brand_column].head(5)):
        print(f"  {i+1}. {brand}")
    
    # 文件验证完成，开始翻译
    print("\n文件验证完成，配置正确！开始翻译...")
    print("正在连接API服务...")
    total_rows = len(df)
    start_row = 0

    if os.path.exists(output_csv):
        print(f"检测到已存在的输出文件 '{output_csv}'。正在检查进度...")
        df_output = pd.read_csv(output_csv, header=0)
        if len(df_output) == total_rows and translated_column in df_output.columns:
            first_untranslated = df_output[translated_column].isnull().idxmax()
            if not df_output[translated_column].isnull().any():
                start_row = total_rows
            elif df_output.loc[first_untranslated, translated_column] == '' or pd.isna(
                    df_output.loc[first_untranslated, translated_column]):
                start_row = first_untranslated

            if start_row > 0:
                print(f"检测到 {start_row} 条已处理记录。将从第 {start_row + 1} 行开始继续。")
                df = df_output
            else:
                print("输出文件为空或格式不符，将从头开始翻译。")
                df[translated_column] = ''
        else:
            print(f"警告：'{output_csv}' 文件行数或列与源文件不匹配，将从头开始并覆盖。")
            df[translated_column] = ''
    else:
        print("未找到输出文件，将创建新文件并从头开始。")
        df[translated_column] = ''

    if translated_column in df.columns:
        cols = df.columns.tolist()
        if translated_column in cols:
            cols.remove(translated_column)
            if brand_column in cols:
                original_col_index = cols.index(brand_column)
                cols.insert(original_col_index + 1, translated_column)
                df = df[cols]

    if start_row >= total_rows:
        print("所有记录均已翻译。程序退出。")
    else:
        for i in range(start_row, total_rows, batch_size):
            end_index = min(i + batch_size, total_rows)
            batch = df[brand_column][i:end_index].tolist()

            if not batch:
                continue

            print(f"\n处理批次：记录 {i + 1} 到 {end_index}...")
            translated_batch = translate_batch(batch)

            if len(translated_batch) == len(batch):
                df.loc[i:end_index - 1, translated_column] = translated_batch
                try:
                    df.to_csv(output_csv, index=False, encoding='utf-8-sig')
                    print(f"批次完成。进度已保存到 '{output_csv}'")
                except Exception as e:
                    print(f"!!! 文件保存失败: {e}. 程序将终止。")
                    break
            else:
                print(f"错误：批次返回结果数量({len(translated_batch)})与批次数量({len(batch)})不符！该批次未保存。")

            if end_index < total_rows:
                print(f"休眠 {sleep_interval} 秒...")
                time.sleep(sleep_interval)

        print(f"\n翻译任务完成。最终输出已保存在 '{output_csv}'")


# --- 程序入口 ---
if __name__ == "__main__":
    if USE_DIRECT_STRING_INPUT:
        run_direct_string_mode()
    else:
        run_csv_batch_mode()